package com.wanmait.schedule.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.wanmait.schedule.entity.CompanyUser;
import com.wanmait.schedule.entity.Userinfo;

import java.util.Calendar;
import java.util.Date;

public class JWTUtils {
    /*
     签发对象：用户的id
     签发时间：现在
     有效时间：30分钟
     载荷内容：用户名和姓名，还可以是其它任何信息
     加密密钥：用户的密码
     */
    public static String createToken(Userinfo userinfo){
/*
* 根据用户创建token
* */
        //--------------创建一个假的token 方便测试 前端使用测试    -------------------
//        return "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyIiwiZXhwIjoxNjQ2NjQyNjMyLCJpYXQiOjE2NDY2NDA4MzIsInVzZXJpbmZvIjoyfQ.7SXsIG4GRnq0LNWP8I_B0-ehlc4Cew3r6sV0wXeVgr4";
                //测试完成后删除 假的

        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE,30);
        Date expiresDate = nowTime.getTime();

        return JWT.create().withAudience(userinfo.getId().toString())   //签发对象
                .withIssuedAt(new Date())    //发行时间
                .withExpiresAt(expiresDate)  //有效时间
                .withClaim("userinfo", userinfo.getId())//载荷,存入公司ID

                .sign(Algorithm.HMAC256(userinfo.getPassword()));   //加密
    }

    //检验合法性，其中secret为用户的密码  在拦截器检验
    public static boolean verifyToken(String token, String secret)
    {
        DecodedJWT jwt = null;
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();
            jwt = verifier.verify(token);
            return true;
        } catch (Exception e) {
            //效验失败
//            throw new JWTVerificationException("token校验失败，非法认证信息");
            return false;
        }

    }

   //获取签发对象也就是用户的id
    public static String getAudience(String token) {
        String audience=null;
        System.out.println("开始解析");
        try {
            audience = JWT.decode(token).getAudience().get(0);

        } catch (JWTDecodeException j) {
            //这里是token解析失败
            System.out.println("解析失败");
            throw new RuntimeException("IllegalToken");
        }
        System.out.println("解析成功");
        return audience;
    }


    //通过载荷名字获取载荷的值
    public static Claim getClaimByName(String token, String name){
        return JWT.decode(token).getClaim(name);
    }
}
